package controllers;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;

import play.mvc.Controller;


import models.Barco;
import models.Classe;
import models.Competicao;
import models.Ordena;
import models.Resultado;
import models.ResultadoClasse;
import models.Rodada;

public class visualizarRodadas extends Application {

	private static Connection conexao;
	private static Statement comando;
	
	/*************************************************************/
	
	protected static void conectar() throws SQLException {  
	    
		  
		try {
			Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException e) {
		}

			conexao = DriverManager.getConnection(  
			        "jdbc:postgresql://localhost:5432/SGRv2",  
			        "postgres",  
			        "senha");
		
			comando =  conexao.createStatement();
	}

	/***********************************************************/
	
	public static void visualizarRodadas(int idcompeticao) throws Exception {
		
		String competicaoid = "";
		try
		{		
			competicaoid  =  request.querystring.toString();

			competicaoid  = competicaoid .substring(5);
			idcompeticao = Integer.parseInt(competicaoid );
			
		}
		catch (Exception e)
		{			
		}
		
		if(idcompeticao == 0)
		{
			visualizarCompeticoes.visualizarCompeticoes();			
		}
		else
		{
			List<Rodada> rodadas = new ArrayList<Rodada>();
			
			rodadas  = Rodada.Rodadas(idcompeticao);
			
			//CARREGA A COMPETICAO
			Competicao comp = new Competicao();
			comp = Competicao.recuperarCompeticao(idcompeticao);
			
			//CARREGA OS RESULTADOS DA COMPETICAO
			List<Resultado> Resultados = new ArrayList<Resultado>();
			Resultados = Resultado.Resultados(idcompeticao);			

			//RECUPERAR BARCOS PARTICIPANTES DA COMPETICAO
			List<Barco> barcosParticipantes  = new ArrayList<Barco>();
			barcosParticipantes = Barco.recuperarBarcos("select * from barco join relacaobarcocompeticao on barco.idbarco = relacaobarcocompeticao.idbarco where relacaobarcocompeticao.idcompeticao =" + idcompeticao );
					
			//REMOVER PIORES RESULTADOS 1 
			Resultados = Resultado.RemoverPioresResultados( barcosParticipantes, Resultados );

			//REMOVER PIORES RESULTADOS 2
			Resultados = Resultado.RemoverPioresResultados( barcosParticipantes, Resultados );
			 
						
			//CARREGANDO CLASSES
			List<ResultadoClasse> resultadoclasses = new ArrayList<ResultadoClasse>();
			List<Classe> classes = new ArrayList<Classe>();
			classes = Classe.Classes();
			
			//GERANDO OS RESULTADOS POR CLASSES
			for(Classe cls : classes) {
				
				ResultadoClasse novo = new ResultadoClasse(); 
				
				novo.setidclasse(cls.getid());
				novo.setnomeclasse(cls.getnome());
				
				List<Resultado> Resultadosc  = new ArrayList<Resultado>();
				
				Resultadosc = Resultado.ResultadosClasse(idcompeticao, cls.getid());
				
				
				//REMOVER PIORES RESULTADOS 1 
				Resultadosc = Resultado.RemoverPioresResultados( barcosParticipantes, Resultadosc );
				
				
				//REMOVER PIORES RESULTADOS 1 
				Resultadosc = Resultado.RemoverPioresResultados( barcosParticipantes, Resultadosc );
				
				novo.setlista(Resultadosc);
				
				if( Resultadosc.size() > 0 )
				{
					resultadoclasses.add(novo);
				}
			}
				
			//SOMANDO RESULTAOS FINAiS
			List<Resultado> Resultadosfinais = new ArrayList<Resultado>();
			for(Barco bps : barcosParticipantes) {
			
				int pontuacaofinal = 0;
				int barcop = bps.getid(); 
				
				for(Resultado rsf : Resultados) {
					if( rsf.getidbarco() == barcop )
					{
						pontuacaofinal += rsf.getpontuacaototal();
					}
				}				
				Resultado resultadofinal = new Resultado();
				resultadofinal.setidbarco(barcop);
				resultadofinal.setnomebarco(bps.getnome());
				resultadofinal.setpontuacaototal(pontuacaofinal);				
			
				Resultadosfinais.add(resultadofinal);
				
			}
			
			List<ResultadoClasse> Resultadofinalclasse = new ArrayList<ResultadoClasse>();
			for(ResultadoClasse rsc : resultadoclasses) {
			
				List<Resultado> Resultadosfinaisclasse = new ArrayList<Resultado>();
				for(Barco bps : barcosParticipantes) {
					
					int pontuacaofinal = 0;
					int barcop = bps.getid(); 
					
					for(Resultado brc : rsc.getlista()) {
						if( brc.getidbarco() == barcop )
						{
							pontuacaofinal += brc.getpontuacaototal();
						}
					}
					
					if(pontuacaofinal > 0)
					{
						Resultado resultadofinalclasse = new Resultado();
						resultadofinalclasse.setidbarco(barcop);
						resultadofinalclasse.setnomebarco(bps.getnome());
						resultadofinalclasse.setpontuacaototal(pontuacaofinal);				
					
						Resultadosfinaisclasse.add(resultadofinalclasse);
					}
				}
				//ORDENANDO RESULTADOS
				Ordena<Resultado> ordenaresultado2 = new Ordena<Resultado>();
				Resultadosfinaisclasse = ordenaresultado2.ordenarLista(Resultadosfinaisclasse, "getpontuacaototal");
				
				
				ResultadoClasse rfc = new ResultadoClasse();
				rfc.setlista(Resultadosfinaisclasse);
				rfc.setidclasse(rsc.getidclasse());
				rfc.setnomeclasse(rsc.getnomeclasse());
				Resultadofinalclasse.add(rfc);
				
			}
			
			//PASSANDO RESULTAODS FINAIS PARA A LISTA
			Resultados = Resultadosfinais;
			
			//ORDENANDO RESULTADOS
			Ordena<Resultado> ordenaresultado = new Ordena<Resultado>();
			Resultados = ordenaresultado.ordenarLista(Resultados, "getpontuacaototal");
			//Collections.reverse(Resultados);
			

			resultadoclasses = Resultadofinalclasse ;
			

			
			
			render(rodadas, comp, Resultados , resultadoclasses );
		}
	}	
	
    /***************************************************************/

	
}











